import { Request, Response } from 'express';
import { AuthRequest } from '@/types';
import <%= businessName %>Service from '@/services/<%= moduleName %>/<%= businessName %>.service';
import ApiResponse from '@/utils/api/api-response.utils';
import ExcelUtil from '@/utils/excel/excel.utils';
import { getLogger } from '@/utils/logger';
import { Log, BusinessType } from '@/decorators/Log';

// 获取模块专用日志记录器
const logger = getLogger('<%= moduleName %>');

// 给Request扩展user属性
declare module 'express' {
  interface Request {
    user?: {
      userId?: number;
      username?: string;
      permissions?: string[];
      roles?: string[];
    };
  }
}

/**
 * <%= functionName %>控制器
 */
class <%= ClassName %>Controller {
  /**
   * 查询<%= functionName %>列表
   * @param req 请求
   * @param res 响应
   */
  public async list(req: Request, res: Response): Promise<void> {
    try {
      const { pageNum = 1, pageSize = 10, ...query } = req.query;
      
      // 转换为数字
      const pNum = parseInt(pageNum as string, 10);
      const pSize = parseInt(pageSize as string, 10);
      
      const { rows, count } = await <%= businessName %>Service.get<%= ClassName %>ListPaged({
        ...query,
        pageNum: pNum,
        pageSize: pSize
      });
      
      ApiResponse.successWithTable(res, rows, count);
    } catch (err) {
      logger.error('查询<%= functionName %>列表失败', err);
      ApiResponse.error(res, '查询<%= functionName %>列表失败');
    }
  }

  /**
   * 导出<%= functionName %>列表
   * @param req 请求
   * @param res 响应
   */
  @Log({ title: '<%= functionName %>', businessType: BusinessType.EXPORT })
  public async export(req: Request, res: Response): Promise<void> {
    try {
      // 查询所有数据（不分页）
      const { rows } = await <%= businessName %>Service.get<%= ClassName %>ListPaged({
        ...req.query,
        pageNum: 1,
        pageSize: 0 // 不分页
      });
      
      // 定义导出字段
      const fields = [
<% columns.forEach(function(column) { %>
<% if(column.isList === '1') { %>
        { header: '<%= column.columnComment %>', key: '<%= column.javaField %>'<% if(column.htmlType === 'datetime') { %>, type: 'datetime'<% } else if(column.dictType && column.dictType !== '') { %>, type: 'select', options: <%= column.dictType %><% } %> },
<% } %>
<% }); %>
      ];
      
      // 导出Excel
      await ExcelUtil.exportToResponse(
        res,
        rows,
        fields,
        `<%= businessName %>_${Date.now()}`,
        '<%= functionName %>数据'
      );
    } catch (err) {
      logger.error('导出<%= functionName %>列表失败', err);
      ApiResponse.error(res, '导出<%= functionName %>列表失败');
    }
  }

  /**
   * 获取<%= functionName %>详细信息
   * @param req 请求
   * @param res 响应
   */
  public async getInfo(req: Request, res: Response): Promise<void> {
    try {
      const <%= pkColumn.javaField %> = parseInt(req.params.<%= pkColumn.javaField %>, 10);
      const data = await <%= businessName %>Service.select<%= ClassName %>ById(<%= pkColumn.javaField %>);
      
      if (data) {
        ApiResponse.success(res, data);
      } else {
        ApiResponse.notFound(res, '未找到该<%= functionName %>');
      }
    } catch (err) {
      logger.error('获取<%= functionName %>详细信息失败', err);
      ApiResponse.error(res, '获取<%= functionName %>详细信息失败');
    }
  }

  /**
   * 新增<%= functionName %>
   * @param req 请求
   * @param res 响应
   */
  @Log({ title: '<%= functionName %>', businessType: BusinessType.INSERT })
  public async add(req: AuthRequest, res: Response): Promise<void> {
    try {
      const <%= businessName %> = req.body;
      
      // 设置创建者
      <%= businessName %>.createBy = req.user?.username;
      
      // 新增
      await <%= businessName %>Service.insert<%= ClassName %>(<%= businessName %>);
      
      ApiResponse.success(res);
    } catch (err) {
      logger.error('新增<%= functionName %>失败', err);
      ApiResponse.error(res, '新增<%= functionName %>失败');
    }
  }

  /**
   * 修改<%= functionName %>
   * @param req 请求
   * @param res 响应
   */
  @Log({ title: '<%= functionName %>', businessType: BusinessType.UPDATE })
  public async edit(req: AuthRequest, res: Response): Promise<void> {
    try {
      const <%= businessName %> = req.body;
      
      // 设置更新者
      <%= businessName %>.updateBy = req.user?.username;
      
      // 更新
      const result = await <%= businessName %>Service.update<%= ClassName %>(<%= businessName %>);
      
      if (result > 0) {
        ApiResponse.success(res);
      } else {
        ApiResponse.error(res, '修改<%= functionName %>失败');
      }
    } catch (err) {
      logger.error('修改<%= functionName %>失败', err);
      ApiResponse.error(res, '修改<%= functionName %>失败');
    }
  }

  /**
   * 删除<%= functionName %>
   * @param req 请求
   * @param res 响应
   */
  @Log({ title: '<%= functionName %>', businessType: BusinessType.DELETE })
  public async remove(req: Request, res: Response): Promise<void> {
    try {
      const <%= pkColumn.javaField %>s = req.params.<%= pkColumn.javaField %>s.split(',').map(id => parseInt(id, 10));
      
      // 删除
      const result = await <%= businessName %>Service.delete<%= ClassName %>ByIds(<%= pkColumn.javaField %>s);
      
      if (result > 0) {
        ApiResponse.success(res);
      } else {
        ApiResponse.error(res, '删除<%= functionName %>失败');
      }
    } catch (err) {
      logger.error('删除<%= functionName %>失败', err);
      ApiResponse.error(res, '删除<%= functionName %>失败');
    }
  }
}

export default new <%= ClassName %>Controller(); 